import time, sys
import os
import matplotlib.pyplot as plt
import cv2 as cv
import pickle
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split


labels = ['cl', 'dlrb', 'lyf', 'pyy', 'xlz', 'zyx']  # 成龙，迪丽热巴，刘亦菲，彭于晏，小李子，张艺兴

# getmodel
def getmodel():
    with open('clf', 'rb') as p:
        Rand = pickle.load(p)
    return Rand


def getimg():
    '''
    # 随机选取一张
    for f in os.listdir('./img'):
        if ".jpg" in f:  # 如果不是图片，则跳过
            print('成功')
            image = cv.imread(f)
            return image
'''

  # 选用多人特定照片#'.\\img'
    for f in os.listdir('./img'):  # 采用相对路径
        if "pre_cl_lyf.jpg"  in f:  # 如果不是图片，则跳过
            print('成功')
            image = cv.imread(f)
            print(image)
            return image


def show(img):

    img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    img_gray = cv.equalizeHist(img_gray)  # 对图像进行直方图增强

    # 1. 创建级联分类器
    face_cascade = cv.CascadeClassifier()
    # 2. 引入训练好的可用于人脸识别的级联分类器模型
    face_cascade.load("haarcascade_frontalface_alt.xml")
    # 3. 用此级联分类器识别图像中的所有人脸信息，返回一个包含有所有识别的人联系系的列表
    # 列表中每一个元素包含四个值：面部左上角的坐标(x,y) 以及面部的宽和高(w,h)
    faces = face_cascade.detectMultiScale(img_gray)

    with open('acc', 'rb') as p:
        acc = pickle.load(p)

    for (x, y, w, h) in faces:

        get = img[y:y + h, x:x + w]
        img2 = cv.resize(get, (500, 500), interpolation=cv.INTER_NEAREST)  # 变成244*244大小图片
        ravel_img = img2.ravel()
        Rand = getmodel()
        result = Rand.predict([ravel_img])
        cv.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

        cv.putText(img,  # 要显示字体的图片
                   labels[result[0]],  # 要显示的内容
                   (x, y - 10),  # 要显示的位置
                   cv.FONT_HERSHEY_SIMPLEX,  # 要使用的字体 -> 一般英文字体
                   1,  # 字体放大倍数
                   (0, 255, 0),  # 字体颜色
                   2)  # 字体线条粗细

    plt.figure(figsize=(10, 5))
    plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    plt.text(30, 30, "acc= {0:.4f}".format(acc), fontdict={'size': '12', 'color': 'b'})
    plt.show()

if __name__ == '__main__':
    img = getimg()
    img = np.array(img)
    print(img.dtype)

    show(img)